/***********************\
* 	Keypad.h		*
 *	by dovoto		*
 *				*
 \***********************/

#ifndef KEYPAD_H
#define KEYPAD_H

#define KEY_A 		1
#define KEY_B 		2
#define KEY_SELECT	4
#define KEY_START 	8
#define KEY_RIGHT 	16
#define KEY_LEFT 	32
#define KEY_UP 		64
#define KEY_DOWN 	128
#define KEY_R		256
#define KEY_L 		512
volatile u32* KEYS = (volatile u32*) 0x04000130;

#define KEY_INTERRUPT 	(1 << 14)
#define KEY_INTERRUPT_OR 0
#define KEY_INTERRUPT_AND (1 << 15)

u16 __key_curr = 0, __key_prev = 0;

#define KEY_MASK     0x03FF

//*** Copyright: TONC - The GBA buttons (a.k.a keys)
// Polling function
void key_poll() {
	__key_prev = __key_curr;
	__key_curr = ~*KEYS & KEY_MASK;
	/*dprint("{");
	dPrintValue(__key_prev);
	dprint(";");
	dPrintValue(__key_curr);
	dprint("}  ");*/

}

// Basic state checks
u32 key_curr_state() {
	return __key_curr;
}
u32 key_prev_state() {
	return __key_prev;
}
u32 key_is_down(u32 key) {
	return __key_curr & key;
}
u32 key_is_up(u32 key) {
	return ~__key_curr & key;
}
u32 key_was_down(u32 key) {
	return __key_prev & key;
}
u32 key_was_up(u32 key) {
	return ~__key_prev & key;
}

u32 key_transit(u32 key) {
	return (__key_curr ^ __key_prev) & key;
}

u32 key_held(u32 key) {
	return (__key_curr & __key_prev) & key;
}

u32 key_hit(u32 key) {
	return (__key_curr & ~__key_prev) & key;
}

u32 key_released(u32 key) {
	return (~__key_curr & __key_prev) & key;
}

#endif
